#version 120	
	uniform vec4 fpar[16];

	float getdist0_sqr(in vec4 pos1, in vec4 pos2) {
		vec4 a = pos1-floor(pos1+vec4(0.5,0.5,0.5,0.5))+vec4(0.5,0.5,0.5,0.5);
		vec4 b = pos2-floor(pos2+vec4(0.5,0.5,0.5,0.5))+vec4(0.5,0.5,0.5,0.5);
		return dot(a,a)+dot(b,b);
	}

	float getdist(in vec3 pos) {
		vec4 pos4 = vec4(pos, 0);
		mat4 m03 = mat4(fpar[4], fpar[5], fpar[6], fpar[7]);
		mat4 m47 = mat4(fpar[8], fpar[9], fpar[10], fpar[11]);
		vec4 rotpos1 = pos4*transpose(m03)+vec4(0.501,0.2501,0.2501,0.2501);
		vec4 rotpos2 = pos4*transpose(m47)+vec4(0.2501,0.2501,0.2501,0.2501);
//		vec4 rotpos1 = pos4*transpose(m03)+vec4(0.25,0.26,0.27,0.28);
		//vec4 rotpos2 = pos4*transpose(m47)+vec4(0.29,0.30,0.31,0.32);
		/* really dumb bruteforce. find better algo some day. */
		float c0d = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.0,0.0), rotpos2+vec4(0.0,0.0,0.0,0.0));
		float c1d = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.0,0.5), rotpos2+vec4(0.0,0.5,0.0,0.5));
		float c2d = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.5,0.5), rotpos2+vec4(0.0,0.0,0.5,0.5));
		float c3d = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.5,0.0), rotpos2+vec4(0.0,0.5,0.5,0.0));
		float c4d = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.0,0.0), rotpos2+vec4(0.5,0.5,0.5,0.5));
		float c5d = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.0,0.5), rotpos2+vec4(0.5,0.0,0.5,0.0));
		float c6d = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.5,0.5), rotpos2+vec4(0.5,0.5,0.0,0.0));
		float c7d = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.5,0.0), rotpos2+vec4(0.5,0.0,0.0,0.5));
		float c8d = getdist0_sqr(rotpos1+vec4(0.5,0.5,0.5,0.5), rotpos2+vec4(0.5,0.5,0.5,0.5));
		float c9d = getdist0_sqr(rotpos1+vec4(0.5,0.0,0.5,0.0), rotpos2+vec4(0.5,0.0,0.5,0.0));
		float cad = getdist0_sqr(rotpos1+vec4(0.5,0.5,0.0,0.0), rotpos2+vec4(0.5,0.5,0.0,0.0));
		float cbd = getdist0_sqr(rotpos1+vec4(0.5,0.0,0.0,0.5), rotpos2+vec4(0.5,0.0,0.0,0.5));
		float ccd = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.0,0.0), rotpos2+vec4(0.5,0.5,0.5,0.5));
		float cdd = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.0,0.5), rotpos2+vec4(0.5,0.0,0.5,0.0));
		float ced = getdist0_sqr(rotpos1+vec4(0.0,0.0,0.5,0.5), rotpos2+vec4(0.5,0.5,0.0,0.0));
		float cfd = getdist0_sqr(rotpos1+vec4(0.0,0.5,0.5,0.0), rotpos2+vec4(0.5,0.0,0.0,0.5));
		float cxd = min(min(min(min(c1d, c2d), min(c3d, c4d)), min(min(c5d, c6d), min(c7d, c8d))), 
			min(min(min(c9d, cad), min(cbd, ccd)), min(min(cdd, ced), cfd)));
		float ld = 1.0;
		return (c0d-cxd)/(2*ld)+ld*0.5-fpar[12].x;
	}

	float intersect(in vec3 rO, in vec3 rD, in vec4 sph) {
		float t = 0;
		for (int i = 0; i<100; i++) t += getdist(rO+t*rD);
		if (getdist(rO+t*rD)>0.01f) t = 0;
		return t;
/*

		vec3  p = rO - sph.xyz;
		float b = dot( p, rD );
		float c = dot( p, p ) - sph.w*sph.w;
		float h = b*b - c;
		if( h>0.0 ) {
			h = -b - sqrt( h );
		}
		return h;*/
	}
	

	void main(void) {
		vec3 dir = normalize(gl_TexCoord[0].xyz);
		vec3 pos = fpar[0].xyz;
		float dif = dot( gl_TexCoord[1].xy-vec2(0.5), vec2(0.707) );
		float t = intersect(pos,dir,fpar[2]);
		if(t>0.0) {
			vec3 inter = pos + t*dir;
			float d0 = getdist(inter);
			vec3 norma = normalize(vec3(getdist(inter+vec3(0.01,0,0))-d0,getdist(inter+vec3(0,0.01,0))-d0,getdist(inter+vec3(0,0,0.01))-d0));
			dif = dot(norma,vec3(0.57703));
		}
		gl_FragColor = (dif*vec4(0.5,0.4,0.3,0.0) + vec4(0.5,0.5,0.5,1.0))*fpar[12].y;
	}
